package com.oneboot.bbsdemo.controller.common;

import com.oneboot.bbsdemo.common.Constants;
import com.oneboot.bbsdemo.utils.Result;
import com.oneboot.bbsdemo.utils.ResultGenerator;
import com.oneboot.bbsdemo.utils.SystemUtil;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.text.SimpleDateFormat;
import java.util.*;

@RestController
public class UoloadController {

    /*
多值支持：大括号允许你指定多个路径。例如，@PostMapping({"/uploadFile", "/upload"}) 可以同时匹配两个不同的URL路径。
单值兼容：即使只有一个路径，也可以使用大括号来保持一致性，方便将来扩展。
 */
    @PostMapping({"/uploadFile"})
    public Result uploadFile(HttpServletRequest request, @RequestParam("file") MultipartFile file) throws URISyntaxException {
        String fileName = file.getOriginalFilename();
        // 文件扩展名
        // substring 方法从这个位置开始截取字符串，直到字符串的末尾。这样就得到了文件的扩展名
        String suffixName = fileName.substring(fileName.lastIndexOf("."));

        // 生成文件名称
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss");
        Random random = new Random();
        StringBuilder sb = new StringBuilder();
        sb.append(sdf.format(new Date())).append(random.nextInt(100)).append(suffixName);
        String newFileName = sb.toString();
        // 新文件
        File fileDir = new File(Constants.UPLOAD_PATH);

        try {
            // 过滤文件父目录不存在的情况
            if (!fileDir.exists()) {
                if (!fileDir.mkdirs()) {
                    throw new IOException("文件夹创建失败，路径为：" + fileDir);
                }
            }

            file.transferTo(fileDir);
            Result result = ResultGenerator.genSuccessResult();

            // SystemUtil.getHost(new URI(request.getRequestURI() + ""))：这部分代码获取当前请求的主机地址。request.getRequestURI() 获取请求的 URI，然后将其转换为 URI 对象，再通过 SystemUtil.getHost 方法提取主机地址。
            // "/upload/" + newFileName：这部分代码拼接了一个路径，表示上传文件的存储位置。newFileName 是新生成的文件名。
            // result.setData(...)：将上述拼接好的完整 URL 设置到 result 对象的 data 属性中，通常用于返回给客户端，表示文件上传后的访问路径。
            result.setData(SystemUtil.getHost(new URI(request.getRequestURI() + "")) + "/upload/" + newFileName);

            return result;
        } catch (Exception e) {
            e.printStackTrace();
            return ResultGenerator.genErrorResult(500, "文件上传失败");
        }


    }

    @PostMapping({"/uploadFiles"})
    public Result uploadFiles(HttpServletRequest request) {
        // 创建一个列表来存储上传的文件
        List<MultipartFile> multipartFiles = new ArrayList<>(8);

        // 创建一个多部分解析器对象
        CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());

        // 检查请求是否为多部分请求
        if (multipartResolver.isMultipart(request)) {
            // 将请求转换为多部分请求
            MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;

            // 获取文件名迭代器
            Iterator<String> it = multiRequest.getFileNames();

            // 初始化文件计数器
            int total = 0;

            // 遍历所有文件
            while (it.hasNext()) {
                if (total > 5) {
                    // 如果文件数量超过5，返回失败结果
                    return ResultGenerator.genFailResult("最多上传五张图片！");
                }
                total += 1;

                // 获取当前文件并添加到文件列表中
                MultipartFile file = multiRequest.getFile(it.next());
                multipartFiles.add(file);
            }
        }

        // 如果没有文件被上传，返回失败结果
        if (CollectionUtils.isEmpty(multipartFiles)) {
            return ResultGenerator.genFailResult("参数异常");
        }

        // 再次检查文件数量是否超过5个
        if (multipartFiles != null && multipartFiles.size() > 5) {
            return ResultGenerator.genFailResult(("最多上传5张照片"));
        }

        // 创建一个列表来存储文件的URL
        List<String> fileNames =new ArrayList(multipartFiles.size());

        //遍历上传的文件
        for (int i = 0; i < multipartFiles.size(); i++) {
            //获取文件的原始名称
            String origName = multipartFiles.get(i).getOriginalFilename();

            //获取文件的后缀名
            String substring = origName.substring(origName.lastIndexOf("."));

            //生成新的文件名称
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss");
            Random random = new Random();
            StringBuilder sb = new StringBuilder();
            sb.append(sdf.format(new Date())).append(random.nextInt(100)).append(substring);
            String newFileName = sb.toString();

            // 获取文件上传目录
            File fileDir = new File(Constants.UPLOAD_PATH);

            // 创建目标文件
            File destFile = new File(Constants.UPLOAD_PATH + newFileName);


            try {
                //如果文件目录不存在，则创建目录
                if(!fileDir.exists()){  // 检查目录是否存在
                    if(!fileDir.mkdir()){  // 尝试创建目录
                        throw new IOException("文件夹创建失败，路径为："+fileDir);
                    }
                }

                // 将文件保存到目标位置
                multipartFiles.get(i).transferTo(destFile);

                //构建文件的URL
                fileNames.add(SystemUtil.getHost(new URI(request.getRequestURI()+""))+"/upload/"+newFileName);
            } catch (Exception e) {
                //文件上传失败则记录异常并返回失败结果
                e.printStackTrace();
                return ResultGenerator.genFailResult("文件上传失败");
            }
        }

        //创建成功结果并设置文件的URL列表
        Result resultSuccess = ResultGenerator.genSuccessResult();
        resultSuccess.setData(fileNames);

        //返回成功结果
        return resultSuccess;
    }


}
